package com.cn.data.collection;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author: chenl
 * @Date: 2019/3/30 22:57
 *
 * @description bitmap为了处理大数据的排序，查找，去重
 * 目的，在2.5亿数据中计算每个数的重复次数
 */
public class BitMap {

    private long capacity;

    private int[] bitMap;

    public BitMap(int maxElement){
        //+1的原因是为了增加一个bit位来标识该值是否存在、次数
        //例： 00表示不存在、10表示存在1次、11表示存在1次以上
        this.capacity = maxElement >> 4;
        initBitMap();
    }

    private void initBitMap(){
        int length = (int) (this.capacity + 1);
        bitMap = new int[length];
    }

    public void display(){
        System.out.println("BitMap位图展示");
        for(int i=0;i<this.capacity;i++){
            List<Integer> list = new ArrayList<>();
            int temp = bitMap[i];
            for(int j=0;j<32;j++){
                list.add(temp & 1);
                temp >>= 1;
            }
            System.out.println("a["+i+"]" + list);
        }
    }


    public int getBitMap(long value){
        int index = (int) (value >> 4);
        int valueIndex = (int) value & 15;
        int bitMapElement = bitMap[index];
        int flag = (bitMapElement >> (valueIndex * 2 + 1)) & 0x01  ;
        if(flag == 1){
            System.out.println(value + "已存在");
        }
        return valueIndex;
    }

    public void setBitMap(long value){
        int index = (int) (value >> 4);
        int valueIndex = (int) value & 15 ;
        int bitMapElement = bitMap[index];
        bitMapElement = bitMapElement | 0x01 <<(valueIndex * 2 + 1);
        bitMapElement = bitMapElement | 0x01 <<(valueIndex * 2) ;
        bitMap[index] =  bitMapElement;
    }


    public static void main(String[] args) {
        int [] array = new int [] {1,2,3,22,0,3,63};
        BitMap bitMap = new BitMap(64);

        for (int i = 0; i < array.length; i++){
            bitMap.setBitMap(array[i]);
        }
        bitMap.getBitMap(12);
        bitMap.display();
    }



}
